import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import * as session from 'express-session'
import { TransformInterceptor } from './interceptor/formData'
import { HttpFilter } from './filters/httpfilter'
import { NestExpressApplication } from '@nestjs/platform-express'

async function bootstrap() {
  // NestFactory.create 是 NestJS 提供的一个工厂方法，用于创建 NestJS 应用实例。
  // <NestExpressApplication> 是泛型类型声明，指定了创建的应用实例是基于 Express 框架的。
  // AppModule 是 NestJS 应用的根模块，它包含了应用的所有组件（控制器、服务等）的注册信息。
  const app = await NestFactory.create<NestExpressApplication>(AppModule)
  // 跨域处理
  app.enableCors({ origin: true, credentials: true })

  // 配置session中间件
  // app.use 是 Express 框架的方法，用于注册中间件。在 NestJS 中，由于使用了 Express 作为底层框架，也可以使用该方法。
  // session 是一个用于处理会话的中间件，通常来自 express-session 包。
  // 配置选项解释：
  // secret：用于对 session ID 进行签名的密钥，防止 session ID 被篡改。
  // resave：是否在每次请求时都重新保存 session，设置为 false 可以减少不必要的 session 保存操作。
  // rolling：是否在每次请求时都重置 session 的过期时间，设置为 true 可以延长 session 的有效期。
  // saveUninitialized：是否保存未初始化的 session，设置为 false 可以避免保存空的 session。
  // name：session ID 的 cookie 名称，这里设置为 yu.sid。
  app.use(session({ secret: 'yu_jian_key', resave: false, rolling: true, saveUninitialized: false, name: 'yu.sid' }))

  // app.useGlobalInterceptors 是 NestJS 提供的方法，用于注册全局拦截器。
  // TransformInterceptor 是自定义的拦截器类，拦截器可以在请求处理前后进行一些额外的操作，例如对响应数据进行转换、日志记录等。
  app.useGlobalInterceptors(new TransformInterceptor())

  //  app.useStaticAssets 是 NestJS 提供的方法，用于配置静态资源服务。
  // 'public' 表示静态资源所在的目录，客户端可以通过访问应用的 URL 来获取该目录下的静态文件（如 HTML、CSS、JavaScript、图片等）。
  app.useStaticAssets('public')

  // app.useGlobalFilters(new HttpFilter())

  await app.listen(3333)
}
bootstrap()
